//-------------------------------------------------------------------------------------------------------------------------//
//------------------projet NSY116 : Thomas BARDET + Philippe BORD + Anne LE-STER + Fabien BRENNER  ------------------------//
//-------------------------------------------------------------------------------------------------------------------------//

import ddf.minim.*;
Minim minim;
AudioPlayer groove;
AudioSample tirspaceship;
AudioSample gameoverfx;
World world;
PImage ps;
PImage ps2;
int gpos;
Starfield starfield;
public PFont f = createFont("EstrangeloEdessa-48", 12, true); // A font to write text on the screen
private String konami = "6665";
private AnimationContext animationContext;

public int laser_count_max = 6;
public boolean isCheatOn = false;

//controle à la sourie si vrai.
public boolean controlIsMouse =  false;

int codeK;
String codeS;

void setup()
{
  noLoop(); // on ne lance pas le jeu tout de suite, on affiche d'abord une page de chargement
  size(1300, 1000);
  colorMode(HSB, 360, 360, 360);
  smooth();
  noStroke();
  noCursor();
  // frameRate(60);
  ps = loadImage("gameover.png");
  ps2 = loadImage("flawlessvictory.png");
  gpos = 0;
  animationContext = new AnimationContext();
  world = new World(animationContext);
  minim = new Minim(this);
  groove = minim.loadFile("souleye_embrace.mp3", 512);
  tirspaceship = minim.loadSample("tir.wav");
  gameoverfx = minim.loadSample("gameover.wav");
  //groove.loop();
  textFont(f, 12);

  starfield = new Starfield( 100 );
}

void draw()
{
  fill(0, 110);
  rect(0, 0, width, height);

  starfield.draw();

  if (!world.spaceShip.isDead)
  {
    fill(#10000A);
    rect(0, height - 250, width, height);

    // Vie de l'univers
    updateWorld();

    // Rendu de l'univers
    world.display();

    //on affiche l'image de chargement
    world.loadingPage();
  }
  else
  {
    displayGameOver();
  }

  if (world.alienAllDead)
  {
    displayVictory();
  }
}

void updateWorld()
{
  // Mise à jour des positions des entités
  world.updatePositions();

  // Vie des aliens
  world.fireAlienProjectiles();

  // Collision des projectiles
  world.checkCollisions();
}

void displayGameOver()
{

  gpos++;
  if (gpos > 300)
  {
    gpos = 300;
    noLoop();
    gameoverfx.trigger();
  }

  tint(255, (gpos * 2/3) + 55);

  image(ps, width / 2 - 538 / 2, gpos, 538, 130);
  //gameoverfx.trigger();
  groove.mute();
  tirspaceship.mute();
}

void displayVictory()
{
  noLoop();
  image(ps2, 0, 0);
  groove.mute();
  tirspaceship.mute();
}


void mousePressed()
{
  // Click sur la souris déclanche un tir, si possible
  world.addLazer();
  //tirspaceship.trigger();
  //println(world.spaceShip.cannonPos); //A décommenter pour afficher l'orientation du cannon dans la console; à chaque tir
}

void keyPressed() 
{
  // appui sur touche haut = on oriente le cannon vers la droite
  // appui sur la touche bas = on oriente le cannon vers la gauche
  if (keyCode == UP && world.spaceShip.cannonPos < 5) {
    world.spaceShip.cannonPos++;
  } 
  else if (keyCode == DOWN && world.spaceShip.cannonPos > -5) {
    world.spaceShip.cannonPos--;
  } 

  // au chargement du jeu, il faut appuyer sur ENTER pour le lancer
  if (keyCode == ENTER) {
    world.startGame();
  }

  // Un appui sur 'P' met le jeu en pause, re-'P' le relance
  if (keyCode == 'P') {
    world.pauseGame();
  }

  //mouvements horizontaux du spaceship.
  //if(keyCode == LEFT )
  if (keyCode == LEFT && animationContext.XpositionGlobalSpaceShip > 1)
  {
    //print(keyCode);
    for(int i = 0; i < 10; i++)
    animationContext.XpositionGlobalSpaceShip -= i;
    //print(animationContext.XpositionGlobalSpaceShip);
  }
  if (keyCode == RIGHT && animationContext.XpositionGlobalSpaceShip < 1290)
  {
    for(int i = 0; i < 10; i++)
    animationContext.XpositionGlobalSpaceShip += i;
  }
  if (keyCode == 32)
  {
    world.addLazer();
  }
  
  if(keyCode > 0 )
  codeS += String.valueOf(keyCode);
  else
  codeS ="";
  
  //print(codeS);
  if (codeS.indexOf(konami) != -1)
  {
    laser_count_max = 66;
    isCheatOn = true;
    //print("yeah rqgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg !");
    codeS = "";
  }
  
}

void stop()
{
  // always close Minim audio classes when you are done with them
  groove.close();
  tirspaceship.close();
  gameoverfx.close();

  // always stop Minim before exiting.
  minim.stop();
  super.stop();
}

